package com.liujun.io.nio.mysql.bean.protocol;

import java.nio.ByteBuffer;
import java.util.Map;

import com.liujun.io.nio.mysql.protocol.comm.MySQLMessage;
import com.liujun.io.nio.mysql.protocol.inf.DataParseInf;

/**
 * 进行第一次的握手协议包
* 源文件名：HandshakePackage.java
* 文件版本：1.0.0
* 创建作者：liujun
* 创建日期：2016年12月8日
* 修改作者：liujun
* 修改日期：2016年12月8日
* 文件描述：TODO
* 版权所有：Copyright 2016 zjhz, Inc. All Rights Reserved.
*/
public class OkPackageBean extends PackageHeader implements DataParseInf<OkPackageBean> {

    /**
     * 返回包的结果,握手包的结果
    * @字段说明 code
    */
    private byte rspCode;

    /**
     * 行数信息
    * @字段说明 affectedRows
    */
    private long affectedRows;

    /**
     * 插入的id
    * @字段说明 insertId
    */
    private long insertId;

    /**
     * 服务状态 
    * @字段说明 serverStatus
    */
    private int serverStatus;

    /**
     * 警告的条数
    * @字段说明 warningCount
    */
    private int warningCount;

    /**
     * 响应信息
    * @字段说明 message
    */
    public byte[] message;

    @Override
    public OkPackageBean readPackage(ByteBuffer buffer) {
        MySQLMessage mm = new MySQLMessage(buffer);

        // 读取包大小
        this.length = mm.readUB3();
        // 读取响应包的 id
        this.seq = mm.read();
        // 响应结果
        this.rspCode = mm.read();
        // 读取长度信息
        this.affectedRows = mm.readLength();
        // 插入的id
        this.insertId = mm.readLength();
        // 服务状态
        this.serverStatus = mm.readUB2();

        this.warningCount = mm.readUB2();
        // 检查在当前位置和限制之间是否有元素。
        if (mm.hasRemaining()) {
            this.message = mm.readBytesWithLength();
        }

        return this;
    }

    @Override
    public int getpackageSize() {
        return 0;
    }

    @Override
    public ByteBuffer getWriteToPackage(Map<String, Object> param) {
        ByteBuffer buffer = ByteBuffer.allocate(512);

        buffer.put((byte) 0x03);
        String msg = "select * from userinfo";
        buffer.put(msg.getBytes());

        return buffer;
    }

    public byte getRspCode() {
        return rspCode;
    }

    public void setRspCode(byte rspCode) {
        this.rspCode = rspCode;
    }

    public long getAffectedRows() {
        return affectedRows;
    }

    public void setAffectedRows(long affectedRows) {
        this.affectedRows = affectedRows;
    }

    public long getInsertId() {
        return insertId;
    }

    public void setInsertId(long insertId) {
        this.insertId = insertId;
    }

    public int getServerStatus() {
        return serverStatus;
    }

    public void setServerStatus(int serverStatus) {
        this.serverStatus = serverStatus;
    }

    public int getWarningCount() {
        return warningCount;
    }

    public void setWarningCount(int warningCount) {
        this.warningCount = warningCount;
    }

    public byte[] getMessage() {
        return message;
    }

    public void setMessage(byte[] message) {
        this.message = message;
    }

}
